package org.ewaf.framework.struts2.util;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import org.apache.commons.lang.StringEscapeUtils;
import org.apache.struts2.StrutsConstants;
import org.apache.struts2.config.DefaultSettings;


@SuppressWarnings("deprecation")
public class EscapeUtil {
	
	private static final String defaultEncoding;
	
	static {
		if (DefaultSettings.isSet(StrutsConstants.STRUTS_I18N_ENCODING)) {
			defaultEncoding = DefaultSettings.get(StrutsConstants.STRUTS_I18N_ENCODING);
		} else {
			defaultEncoding = "UTF-8";
		}
	}
	
	/**
	 * 根据应用的字符集对字符串进行URL编码
	 */
	public static String url(Object obj) {
		if (obj == null) {
			return "";
		}
		
		try {
			return URLEncoder.encode(obj.toString(), defaultEncoding);
		} catch (UnsupportedEncodingException e) {
			throw new IllegalStateException(e);
		}
	}
	
	/**
	 * 对单、双引号中的特殊字符进行预处理，防止javascript解析出错。
	 * 当输出脚本变量时，必须预处理。例如：
	 * <script>
	 * 	 var s = "<%= EscapeUtil.javascript(value) %>";
	 * </script>
	 */
	public static String javascript(Object obj) {
		if (obj == null) {
			return "";
		}
		
        return StringEscapeUtils.escapeJavaScript(obj.toString());
	}
	
	/**
	 * 对特殊字符<>"&等进行预处理，防止HTML解析出错。
	 * 当输出input、area等元素的value属性时，必须预处理。例如：
	 * <input name="foo" value="<%= EscapeUtil.html(value) %>">
	 */
	public static String html(Object obj) {
		if (obj == null) {
			return "";
		}
		
		return StringEscapeUtils.escapeHtml(obj.toString());
	}
	
	/**
	 * 将文本转化成HTML显示，换行符被替换成<BR>
	 */
	public static String txt2html(String txt) {
		if (txt == null) {
			return "";
		}
		
		txt = txt.replaceAll("\\r\\n|\\r|\\n", "<BR>");
		
		return txt;
	}
	
	/**
	 * 对特殊字符<>"&等进行预处理，防止XML解析出错。
	 */
	public static String xml(Object obj) {
		if (obj == null) {
			return "";
		}
		
		return StringEscapeUtils.escapeXml(obj.toString());
	}
	
}
